package cn.kgc.ucenter.service.impl;

import cn.kgc.common.utils.UUIDUtils;
import cn.kgc.common.utils.UrlUtils;
import cn.kgc.common.utils.constants.Constants;
import cn.kgc.common.utils.reids.RedisKeyUtils;
import cn.kgc.common.utils.reids.RedisUtils;
import cn.kgc.ucenter.entity.Users;
import cn.kgc.ucenter.entity.dto.UsersDto;
import cn.kgc.ucenter.mapper.UsersMapper;
import cn.kgc.ucenter.service.UsersService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 用户 服务实现类
 * </p>
 *
 * @author qf
 * @since 2021-08-04
 */
@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements UsersService {

    private final UsersMapper usersMapper;

    private final RedisUtils redisUtils;

    public UsersServiceImpl(UsersMapper usersMapper, RedisUtils redisUtils) {
        this.usersMapper = usersMapper;
        this.redisUtils = redisUtils;
    }

    @Override
    public UsersDto loginByWechat(String access_token, String openid) {
        // 1.判断openid在数据库中是否存在
        UsersDto userDto = usersMapper.getUserDto(openid);
        // 如果user为null表示数据库没有（用户第一次扫码）
        if (userDto == null) {
            // 根据access_token 和 openid获取用户信息
            Map<String, Object> map = this.weChatUserInfo(access_token, openid);
            Users user = new Users();
            user.setOpenId(openid);
            if (map != null) {
                if (map.get("nickname") != null) {
                    user.setUserName(map.get("nickname").toString());
                }
                if (map.get("sex") != null) {
                    user.setSex(Integer.parseInt(map.get("sex").toString()));
                }
                if (map.get("headimgurl") != null) {
                    user.setFaceUrl(map.get("headimgurl").toString());
                }
            }
            // user插入数据库
            this.save(user);
            userDto = new UsersDto(user);
        }
        // 登录，将用户信息缓存到redis
        setToken(userDto);
        return userDto;
    }

    @Override
    public UsersDto getLoginByToken(String token) {
        UsersDto usersDto = null;
        // 1.判断redis中有没有这个token
        // 拼接前缀
        String key = RedisKeyUtils.formatKeyWithPrefix(Constants.Redis.PREFIX_TOKEN, token);
        // redis通过key，获取value
        String value = redisUtils.getValue(key);
        // 有，直接返回
        if (!StringUtils.isBlank(value)) {
            usersDto = JSON.parseObject(value, UsersDto.class);
        }
        // 没有，查询
        return usersDto;
    }

    // 获取微信用户信息
    public Map<String, Object> weChatUserInfo(String access_token, String openid) {
        Map<String, Object> map = new HashMap<>();
        String url = "https://api.weixin.qq.com/sns/userinfo" +
                "?access_token=" + access_token +
                "&openid=" + openid;
        String resultJson = UrlUtils.loadURL(url);
        map = JSON.parseObject(resultJson, Map.class);
        return map;
    }

    // 设置用户登录
    public void setToken(UsersDto usersDto) {
        // 1.生成token
        String token = UUIDUtils.getUUID32();
        // 2.将token存入对象
        usersDto.setToken(token);
        // 3.将token存入redis: key=token value=usersDto
        // 3.1 设置key的前缀
        String key = RedisKeyUtils.formatKeyWithPrefix(Constants.Redis.PREFIX_TOKEN, token);
        // 3.2 存入redis
        //redisUtils.putValue(key, JSON.toJSONString(usersDto), Constants.Duration.HALF_AN_HOUR);
        redisUtils.putValue(key, JSON.toJSONString(usersDto));
    }


}
